package com.lfs.market.controller.front;

import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.hutool.core.bean.BeanUtil;
import com.lfs.market.constants.ProductConstant;
import com.lfs.market.exception.ServiceException;
import com.lfs.market.model.R;
import com.lfs.market.model.dto.ProductInfoDto;
import com.lfs.market.model.dto.ProductInfoPageDto;
import com.lfs.market.model.entity.ProductInfo;
import com.lfs.market.model.enums.ResultCode;
import com.lfs.market.model.vo.*;
import com.lfs.market.service.ProductInfoService;
import com.lfs.market.service.ProductOrderService;
import com.lfs.market.service.ProductVoucherService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;


@RestController
@RequestMapping("/product/info")
@SaCheckLogin
public class ProductInfoController {
    @Autowired
    private ProductInfoService productInfoService;
    @Autowired
    private ProductOrderService productOrderService;
    @Autowired
    private ProductVoucherService productVoucherService;


    /**
     * 发布商品
     *
     * @param dto
     * @return
     */
    @PostMapping
    public R createProductInfo(@RequestBody ProductInfoDto dto) {
        return productInfoService.createProductInfo(dto);
    }

    /**
     * 查询商品信息
     *
     * @param pageDto
     * @return
     */
    @GetMapping("/pag")
    public R<List<ProductInfoPageVo>> getProductList1(ProductInfoPageDto pageDto) {
        List<ProductInfoPageVo> result;

        if (pageDto.getStartPrice() != null || pageDto.getEndPrice() != null) {
            result = productInfoService.getPriceProductList(pageDto);
        } else {
            result = productInfoService.getProductList(pageDto);
        }
        return R.ok(result);
    }

    /**
     * 查询商品信息
     *
     * @param pageDto
     * @return
     */
    @GetMapping("/page")
    public R<List<ProductInfoPageVo>> getProductList(ProductInfoPageDto pageDto) {
        List<ProductInfoPageVo> result = null;
        //不带价格查询商品
        if (pageDto.getStartPrice() == null && pageDto.getEndPrice() == null) {
            result = productInfoService.getPriceProduct(pageDto);
            //小于等于EndPrice的商品
        } else if (pageDto.getStartPrice() == null && pageDto.getEndPrice() != null) {
            result = productInfoService.getEndPriceProduct(pageDto);
            //查询大于等于StartPrice的商品
        } else if (pageDto.getStartPrice() != null && pageDto.getEndPrice() == null) {
            result = productInfoService.getStartPriceProduct(pageDto);
            //查询在两个价格之间的商品
        } else if (pageDto.getStartPrice() != null && pageDto.getEndPrice() != null) {
            result = productInfoService.getPriceBetweenProduct(pageDto);
        }
        return R.ok(result);
    }

    @GetMapping("/detail")
    public R<ProductInfoDetailVo> getProductInfo(String productId) {
        ProductInfoDetailVo productInfoDetailVo = productInfoService.getProductInfo(productId);
//        ProductVoucher one = productVoucherService.lambdaQuery().eq(ProductVoucher::getProductId, productInfoDetailVo.getId()).one();
//        productInfoDetailVo.setProductVoucher(one);
        return R.ok(productInfoDetailVo);
    }

    /**
     * 删除商品信息
     *
     * @param id
     * @return
     */
    @DeleteMapping("/{id}")
    public R delProductInfo(@PathVariable("id") String id) {
        boolean result = productInfoService.removeById(id);
        if (!result) throw new ServiceException(ResultCode.DeleteError);
        return R.ok();
    }

    /**
     * 下架商品
     *
     * @param id
     * @return
     */
    @PutMapping("/disable/{id}")
    public R disableProductInfo(@PathVariable("id") String id) {
        ProductInfo productInfo = productInfoService.getById(id);
        if (BeanUtil.isEmpty(productInfo)) throw new ServiceException(ResultCode.NotFindError);
        productInfo.setStatus(ProductConstant.SOLD_OUT);
        boolean result = productInfoService.updateById(productInfo);
        if (!result) throw new ServiceException(ResultCode.UpdateError);
        return R.ok();
    }

    /**
     * 查询已发布的商品信息
     *
     * @return
     */
    @GetMapping("/my/publish")
    public R<List<ProductInfo>> getMyPublish() {
        List<ProductInfo> list = productInfoService.getMyProductInfoList();
        return R.ok(list);
    }

    /**
     * 查询已买入的商品信息
     *
     * @return
     */
    @GetMapping("/my/buy")
    public R<List<BuyProductVo>> getMyBuy() {
        List<BuyProductVo> list = productInfoService.getMyBuy();
        return R.ok(list);
    }

    /**
     * 查询用户订单信息
     *
     * @return
     */
    @GetMapping("/my/order")
    public R<List<OrderProductVo>> getMyOrder() {
        List<OrderProductVo> list = productInfoService.getMyOrder();
        return R.ok(list);
    }

    /**
     * 查询已经卖出的商品信息
     *
     * @return
     */
    @GetMapping("/my/sell")
    public R<List<SellProductVo>> getMySell() {
        List<SellProductVo> list = productInfoService.getMySell();
        return R.ok(list);
    }

    /**
     * 我的收藏
     *
     * @return
     */
    @GetMapping("/my/collect")
    public R<List<ProductInfo>> getMyProductCollectInfo() {
        List<ProductInfo> list = productInfoService.getMyProductCollectInfo();
        return R.ok(list);
    }

    /**
     * 动态列表
     *
     * @return
     */
    @GetMapping("/list/my")
    public R<List<ProductInfoTrendVo>> getMyProductInfoList() {
        List<ProductInfoTrendVo> list = productInfoService.active();
        return R.ok(list);
    }

    /**
     * 想要人数+1
     *
     * @param productId
     * @return
     */
    @PutMapping("/like/count/{productId}")
    public R createLikeCount(@PathVariable("productId") String productId) {
        productInfoService.createLikeCount(productId);
        return R.ok();
    }
}

